﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SoftwareConsulting.BI11.Studio.ProcessWait;

namespace SoftwareConsulting.BI11.Studio.DataTransfer
{    
    /// <summary>
    /// Класс абстрактного узла данных
    /// </summary>
    public abstract class DataNode
    {
        private List<object[]> _data;//данные узла
        private bool _ready;//флаг готовности узла к работе        
        private ProgressEvent _onProgress;//событие прогресса работы узла

        /// <summary>
        /// Возвращает/устанавливает обработчик события прогресса работы узла
        /// </summary>
        public ProgressEvent OnProgress
        {
            get
            {
                return _onProgress;
            }
            set
            {
                _onProgress = value;
            }
        }

        /// <summary>
        /// Вызывает событие прогресса узла
        /// </summary>
        /// <param name="progress">прогресс в процентах</param>
        protected void CallProgress(int progress)
        {
            if (OnProgress != null)
                OnProgress(this, new ProgressEventArgs(progress));
        }

        /// <summary>
        /// Записывает данные
        /// </summary>
        /// <param name="records"></param>
        internal abstract void TransferData(List<object[]> records);

        /// <summary>
        /// Возвращает данные узла
        /// </summary>
        /// <returns></returns>
        internal List<object[]> GetData()
        {
            List<object[]> result = new List<object[]>();
            for (int i = 0; i < _data.Count; i++)
            {
                result.Add(_data[i].Clone() as object[]);
            }
            return result;
        }

        /// <summary>
        /// Возвращает данные узла
        /// </summary>
        protected List<object[]> Data
        {
            get
            {
                return _data;
            }
        }

        /// <summary>
        /// Возвращает флаг готовности узла к работе
        /// </summary>
        public bool IsReady
        {
            get
            {
                return _ready;
            }
        }

        /// <summary>
        /// Устанавливает флаг готовности узла к работе в положение ГОТОВ
        /// </summary>
        public void SetReady()
        {
            _ready = true;
        }

        /// <summary>
        /// Конструктор класса
        /// </summary>
        public DataNode()
        {
            _ready = false;
            _data = new List<object[]>();
        }
    }
}
